package com.veer.shop.service.impl.admin;

import java.math.BigDecimal;
import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import org.springframework.web.multipart.MultipartFile;
import com.veer.shop.config.ImportExcelConfig;
import com.veer.shop.config.OpResult;
import com.veer.shop.mapper.ProductCategoryMapper;
import com.veer.shop.pojo.ImportProductData;
import com.veer.shop.pojo.ProductCategory;
import com.veer.shop.pojo.ResponseData;
import com.veer.shop.service.admin.ImportService;
import com.veer.shop.utils.ExcelUtil;
import com.veer.shop.utils.FileUtil;
import com.veer.shop.utils.ResponseUtil;
/**
 * 文件数据导入业务实现类
 * 
 * @author WangBin
 * 2020年12月30日-下午5:14:36
 */
@Service
public class ImportServiceImpl implements ImportService{
	
	@Autowired
	ProductServiceImpl productServiceImpl;
	@Autowired
	ProductCategoryMapper productCategoryMapper;
	
	@Override
	public ResponseData<?> upload(MultipartFile multipartFile, String scene) {
		// 文件是否为空
		if(multipartFile.isEmpty()) {
			return ResponseUtil.error("请选择文件再上传！");
		}
		
		// 导入场景是否存在
		if(StringUtils.isEmpty(scene) || !ImportExcelConfig.ALLOWED_IMPORT_SCENE_LIST.contains(scene)) {
			return ResponseUtil.error("不识别的导入场景！");
		}
		
		// 上传原文件名
		String originalFileName = multipartFile.getOriginalFilename();
		// 文件格式
		String fileFormat = FileUtil.getFileFormat(originalFileName, false);
		// 是否支持的文件格式
		if(!ImportExcelConfig.ALLOWED_IMPORT_EXCEL_FORMAT_LIST.contains(fileFormat.toLowerCase())) {
			return ResponseUtil.error("不支持的文件格式！");
		}
		// 存储服务器的文件名称
		String filename = FileUtil.getCustomFileName().concat(".").concat(fileFormat);
		OpResult<String> importResult = FileUtil.upload(multipartFile, filename);
		// 文件上传成功
		if(importResult.getFlag()) {
			// 根据不同的场景值读取文件
			OpResult<String> handleResult = handleByScene(importResult.getData(), scene);
			if(handleResult.getFlag()) {
				return ResponseUtil.success(handleResult.getMessage());
			}
			return ResponseUtil.error(handleResult.getMessage());
		}
		
		return ResponseUtil.error(importResult.getMessage());
	}
	
	/**
	 * 根据上传的文件和场景值处理读取文件内容
	 * 
	 * @param filename
	 * @param scene
	 */
	private OpResult<String> handleByScene(String filename, String scene) {
		OpResult<String> opResult = new OpResult<String>();
		try {
			// 读取文件内容
			OpResult<List<Map<Integer, String>>> excelReadResut = ExcelUtil.read(filename, ImportExcelConfig.IMPORT_SCENE_TPL_MAP.get(scene), 1);
			// 读取Excel文件失败
			if(!excelReadResut.getFlag()) {
				throw new Exception(excelReadResut.getMessage());
			}
			
			// 分场景处理数据导入
			switch (scene) {
				case ImportExcelConfig.IMPORT_SCENE_PRODUCT:
					// 导入商品场景
					// 保存商品
					opResult = saveProductData(excelReadResut.getData());
					break;
				default:
					break;
			}
		} catch (Exception e) {
			opResult.setMessage(e.getMessage());
		}
		
		return opResult;
	}
	
	/**
	 * 开始保存商品数据
	 * 
	 * @param productData
	 * @return
	 */
	private OpResult<String> saveProductData(List<Map<Integer, String>> productData) {
		OpResult<String> opResult = new OpResult<String>();
		System.out.println("商品总数" + productData.size());
		try {
			for (Map<Integer, String> product : productData) {
				System.out.println("正在保存商品" + product.get(1));
				// 查询分类ID
				ProductCategory productCategory = productCategoryMapper.selectByBn(product.get(2));
				if(productCategory == null) {
					throw new Exception("商品分类(" + product.get(2) + ")不存在");
				}
				ImportProductData importData = new ImportProductData();
				importData.setProductBn(product.get(0)); // 商品编号
				importData.setProductName(product.get(1)); // 商品名称
				importData.setCategoryBn(product.get(2)); // 分类编码
				importData.setCategoryName(product.get(3)); // 分类名称
				importData.setSalesPrice(new BigDecimal(product.get(4))); // 销售价格
				importData.setUnit(product.get(5)); // 单位
				importData.setQty(Integer.valueOf(product.get(6))); // 库存
				importData.setCategoryId(productCategory.getCategoryId()); // 分类ID
				productServiceImpl.saveProductByBn(importData);
				System.out.println("保存商品(" + importData.getProductBn() + ")成功");
			}
			opResult.setFlag(true);
			opResult.setMessage("导入商品成功");
		} catch (Exception e) {
			opResult.setMessage(e.getMessage());
			e.printStackTrace();
		}
		return opResult;
	}
}
